home *** CD-ROM | disk | FTP | other *** search
- /*
- post / 郵便番号検索プログラム
-
- p_doku.c / 独自検索部
- */
-
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <sys/dos.h>
- #include <mbstring.h>
- #include "post.h"
-
-
- /*
- 独自検索メイン
- */
- void
- dokuji_kensaku()
- {
- int ofs_taihi = 0, /* オフセット退避用 */
- kensuu = 0, /* 検索ヒット件数 */
- nextp = 0, /* 次回検索用オフセット */
- gen_page = 0, /* 現在のページ数 */
- zen_page = 0, /* 全ページ数 */
- kijun = 0, /* 表示用基準 */
- ki = 0, /* 基準から算出した件数 */
- aza_sw = 0, /* 字名スイッチ */
- s_num = 0, /* 選択用 */
- mainlp = 0, /* 表示ループ用 */
- lp = 0, /* 表示ループ用(その2) */
- lpcnt = 0, /* 表示ループ用(その2) */
- shitei_ku_unkn = 0, /* 指定都市内の区名が不明スイッチ(長いねどうも) */
- uchikiri = 0, /* 検索打ち切りスイッチ */
- slen = 0, /* 検索文字列長さ */
- i1; /* ループ汎用 */
-
- uchar pnum[12][10], /* 郵便番号 */
- pknum[12][8], /* 旧番号 */
- numwork[12], /* 取りワーク */
- numbuff[64], /* 入力用ワーク */
- bdelim; /* 直前のデリミタ */
-
- int point[GENKAI]; /* ポインタ保存用 */
-
- uchar joukyou[GENKAI]; /* ヒット時のオフセット */
-
- uchar page_todou[12][10], /* ページ用の都道府県ワーク */
- page_kugun[12][32], /* ページ用の市区郡ワーク */
- page_tyouson[12][32], /* ページ用の市内区・町村ワーク */
- page_azamei[12][256], /* ページ用の字名ワーク(50文字で打ち切り) */
- page_yomi0[12][16], /* ページ用読み(都道府県) */
- page_yomi1[12][64], /* ページ用読み(市区郡) */
- page_yomi2[12][64], /* ページ用読み(市内区・町村) */
- page_yomi3[12][128]; /* ページ用読み(字名) */
-
- struct _inpptr inpp;
-
-
- slen = strlen( input_str );
- ofs_taihi = ofs;
- ofs = 0; /* 最初から検索 */
- kensuu = 0;
- do {
- ofs = bm_find( '.', input_str, ofs );
- if( ofs == -1 ) {
- break;
- }
- if( kensuu == GENKAI ) { /* 件数 == GENKAI で検索打ち切り */
- uchikiri = 1;
- break;
- }
-
- /* 厳密検索 */
- if( genmitsu_mode ) { /* 限定検索モードなら */
- /* いま ofs は文字列の次のデリミタ位置にある */
- if( is_not_delim( buf[ofs] ) ) { /* 直後がデリミタでない */
- continue; /* ならば、途中で終わった */
- }
- if( is_not_delim( buf[ofs-slen-1] ) ) { /* 直前がデリミタでない */
- continue; /* ならば、途中でヒットした */
- }
- }
-
- /* ヒットしました */
- nextp = ofs; /* 今のオフセットをとっておく */
- pass_back_han( '.' ); /* 直前のデリミタまで戻る */
-
- /* 字名限定の時は、字名以外は取らない */
- if( azamei_gentei ) {
- if( buf[ofs-1] != '%' ) {
- ofs = nextp;
- continue;
- }
- }
-
- /* がめる */
- point[ kensuu ] = ofs - 1; /* これはデリミタを指している */
- joukyou[ kensuu ] = buf[ ofs-1 ]; /* オフセットを取っておく */
- kensuu++;
- ofs = nextp; /* オフセットを戻す */
- } while( 1 );
- ofs = ofs_taihi;
-
- if( kensuu != 0 ) { /* あった */
-
- gen_page = 1; /* 1ページ目から */
-
- if( kensuu % 12 == 0 ) {
- zen_page = kensuu / 12;
- } else {
- zen_page = kensuu / 12 + 1;
- }
-
- if( zen_page == 0 ) {
- zen_page = 1;
- }
-
- mainlp = 1;
- do {
- _dos_c_cls_al();
- status_print();
- printf("該当件数 : %4d 件",kensuu );
- if( uchikiri ) { /* 検索を打ち切っていたら */
- printf("(打切)");
- } else {
- printf("\t");
- }
- printf("\nページ : %2d / %2d\n", gen_page, zen_page);
-
- /* 基準値 */
- kijun = (gen_page - 1) * 12;
-
- /* 実際に表示する件数 */
- /* 1ページしかない、もしくは最終ページなら調整 */
- if( gen_page == zen_page ) {
- if( zen_page >= 2 ) {
- lpcnt = kensuu - ((zen_page-1)*12);
- } else {
- lpcnt = kensuu;
- }
- } else {
- lpcnt = 12;
- }
-
- /* 初期化 */
- for( i1=0; i1<=11; i1++ ) {
- page_todou[i1][0] = '\0';
- page_kugun[i1][0] = '\0';
- page_tyouson[i1][0] = '\0';
- page_azamei[i1][0] = '\0';
- page_yomi0[i1][0] = '\0';
- page_yomi1[i1][0] = '\0';
- page_yomi2[i1][0] = '\0';
- page_yomi3[i1][0] = '\0';
- pnum[i1][0] = '\0';
- }
-
- /* データを取ってくる */
- for( i1=0; i1<=lpcnt-1; i1++ ) {
-
- aza_sw = 0;
- ki = kijun + i1;
- ofs = point[ ki ] + 1;
- bdelim = joukyou[ ki ]; /* デリミタセット */
-
- /* case で処理しないのには理由があるので注意 */
- if( bdelim == '%' ) { /* 字名 */
-
- /* 字名を得る */
- get_next_han( page_azamei[i1] );
- /* 50 字で打ち切り */
- if( strlen( page_azamei[i1] ) >= 48 ) {
- page_azamei[i1][48]='\0';
- strcat( page_azamei[i1], "〈略〉" );
- }
- get_next_han2( page_yomi3[i1] ); /* 読み */
- if( buf[ofs] != '*' ) {
- //printf("例外!!!\n");
- pass_next_han2( '*' );
- }
- ofs++;
- get_next_num( numwork );
- number_seikei( numwork );
- strcpy( pnum[i1], " " );
- strcat( pnum[i1], numwork );
- ofs++;
- get_next_num( pknum[i1] );
- aza_sw = 1;
-
- /* 市区郡町村(市内区も)デリミタに */
- /* ぶつかるまで、バックトレース */
- /* 得られたデリミタは、bdelim へ */
- bdelim = backtrace();
- }
-
- if( bdelim == '!' ) { /* 市名 */
-
- /* 市名を得る */
- get_next_han( page_kugun[i1] );
- strcat( page_kugun[i1], "市" );
- get_next_han2( page_yomi1[i1] );
-
- if( !aza_sw ) { /* 字名が得られていない */
-
- /* 政令指定都市であれば */
- if( seirei_check( page_kugun[i1] ) != -1 ) {
-
- /* 市内区が unknown である */
- shitei_ku_unkn = 1;
- }
- }
-
- /* 県へ戻る準備 */
- pass_back_han( ' ' );
- bdelim = ' ';
- }
-
- if( bdelim == '\"' ) { /* 特別区 */
-
- /* 区名を得る */
- get_next_han( page_kugun[i1] );
- strcat( page_kugun[i1], "区" );
- get_next_han2( page_yomi1[i1] );
-
- /* 特別区は東京都に決まっているのだけど */
- pass_back_han( ' ' );
- bdelim = ' ';
- }
-
- if( bdelim == '$' ) { /* 市内区 */
-
- /* 市内区名を得る */
- get_next_han( page_tyouson[i1] );
- strcat( page_tyouson[i1], "区" );
- get_next_han2( page_yomi2[i1] );
-
- /* 直前の市名を得る */
- pass_back_han( '!' );
- get_next_han( page_kugun[i1] );
- strcat( page_kugun[i1], "市" );
- get_next_han2( page_yomi1[i1] );
-
- /* 県へ戻る準備 */
- pass_back_han( ' ' );
- bdelim = ' ';
- }
-
- if( bdelim == ':' ) { /* 町名 */
-
- /* 町名を得る */
- get_next_han( page_tyouson[i1] );
- strcat( page_tyouson[i1], "町" );
- get_next_han2( page_yomi2[i1] );
- ichien_check( pnum[i1], pknum[i1] );
-
- /* 郡へ戻る準備 */
- pass_back_han( '#' );
- bdelim = '#';
- }
-
- if( bdelim == ';' ) { /* 村名 */
-
- /* 町名を得る */
- get_next_han( page_tyouson[i1] );
- strcat( page_tyouson[i1], "村" );
- get_next_han2( page_yomi2[i1] );
- ichien_check( pnum[i1], pknum[i1] );
-
- /* 郡へ戻る準備 */
- pass_back_han( '#' );
- bdelim = '#';
- }
-
- if( bdelim == '#' ) { /* 郡名 */
-
- /* 郡名を得る */
- get_next_han( page_kugun[i1] );
- strcat( page_kugun[i1], "郡" );
- get_next_han2( page_yomi1[i1] );
-
- /* 島しょなら、ヌルね */
- if( strcmp( page_kugun[i1], "島しょ郡" ) == 0 ) {
- strcpy( page_kugun[i1], "" );
- strcpy( page_yomi1[i1], "" );
- }
-
- /* 県へ戻る準備 */
- pass_back_han( ' ' );
- bdelim = ' ';
- }
-
- if( bdelim == ' ' ) { /* 県名 */
-
- /* 県名を得る */
- get_next_han( page_todou[i1] );
- get_next_han2( page_yomi0[i1] );
-
- } else {
- printf("異常 501 : 独自検索で県名を突破した\n");
-
- printf("point[ki]=|%d|\n",point[ki]);
- printf("joukyou[ki]=|%c|\n",joukyou[ki]);
- printf("page_todou[i1]=|%s|\n",page_todou[i1]);
- printf("page_kugun[i1]=|%s|\n",page_kugun[i1]);
- printf("page_tyouson[i1]=|%s|\n",page_tyouson[i1]);
- printf("page_azamei[i1]=|%s|\n",page_azamei[i1]);
- printf("bdelim=|%c|\n",bdelim);
- printf("\n");
-
- return;
- }
-
- printf("%4d: ", ki+1 ); /* 件数表示 */
-
- if( shitei_ku_unkn && joukyou[ki] == '!' ) {
- printf("指定都市名");
- } else {
- switch( joukyou[ki] ) {
- case ' ':
- printf("都道府県名");
- break;
- case '#':
- printf("郡名\t");
- break;
- case '!':
- printf("市名\t");
- break;
- case ':':
- printf("町名\t");
- break;
- case ';':
- printf("村名\t");
- break;
- case '\"':
- printf("特別区名\t");
- break;
- case '$':
- printf("市内区名\t");
- break;
- case '%':
- printf("字名\t");
- break;
- default:
- printf("\t\t");
- break;
- }
- }
-
- /* 長さの調整 */
- keta( page_todou[i1], page_yomi0[i1] );
- keta( page_kugun[i1], page_yomi1[i1] );
- keta( page_tyouson[i1], page_yomi2[i1] );
- keta( page_azamei[i1], page_yomi3[i1] );
-
- /* 読みの表示 */
- printf(" ");
- kugiri();
- printf("%s",page_yomi0[i1]);
- kugiri();
- if( page_yomi1[i1][0] != '\0' ) {
- printf("%s", page_yomi1[i1] );
- kugiri();
- }
- if( page_yomi2[i1][0] != '\0' ) {
- printf("%s", page_yomi2[i1] );
- kugiri();
- }
- if( page_yomi3[i1][0] != '\0' ) {
- printf("%s", page_yomi3[i1] );
- kugiri();
- }
- puts("");
-
- /* 次の行 */
- if( pnum[i1][0] != '\0' ) { /* 番号が分かっていれば */
- if( k_suppress ) {
- printf("\t");
- } else {
- k_num_disp( pknum[i1] );
- }
- printf("%s", pnum[i1] ); /* 郵便番号表示 */
- } else {
- printf("\t\t ");
- }
- kugiri();
-
- /* 地名の表示 */
- if( joukyou[ki] == ' ' ) { /* 県からなら */
- moji_pr(page_todou[i1],input_str); /* 色付き */
- } else {
- printf("%s",page_todou[i1]); /* 普通に */
- }
- kugiri();
- if( page_kugun[i1][0] != '\0' ) {
- if( joukyou[ki] == '!' ||
- joukyou[ki] == '#' ||
- joukyou[ki] == '\"' ) {
- moji_pr(page_kugun[i1],input_str);
- } else {
- printf("%s",page_kugun[i1]);
- }
- kugiri();
- }
- if( page_tyouson[i1][0] != '\0' ) {
- if( joukyou[ki] == ':' ||
- joukyou[ki] == ';' ||
- joukyou[ki] == '$' ) {
- moji_pr(page_tyouson[i1],input_str);
- } else {
- printf("%s",page_tyouson[i1]);
- }
- kugiri();
- }
- if( page_azamei[i1][0] != '\0' ) {
- if( joukyou[ki] == '%' ) {
- moji_pr(page_azamei[i1],input_str);
- } else {
- printf("%s",page_azamei[i1]);
- }
- kugiri();
- }
- if( pnum[i1][0] == '*' ) {
- printf("(全域)");
- }
- puts("");
- }
-
- /* キー入力 */
- puts("");
- printf("字名切替:a 旧番号切替:k 区切:d 厳密検索:g\n");
- printf("地名選択:番号");
- if( gen_page != zen_page ) { /* 最終ページなら*/
- printf(" 次ページ:n"); /* 「次ページ」を表示しない */
- }
- if( gen_page != 1 ) { /* 1ページ目なら */
- printf(" 前ページ:b"); /* 「前ページ」を表示しない */
- }
- printf(" 次検索:p 終了:q or e\n");
- inpp.max = 64;
- inpp.length = 64;
-
- lp = 1;
- do{
- fep_off();
- _dos_gets( &inpp );
- strcpy( numbuff, inpp.buffer );
-
- if( numbuff[0] == 'q' || numbuff[0] == 'Q' ||
- numbuff[0] == 'e' || numbuff[0] == 'E' ) {
- puts("");
- exit( 0 );
-
- } else if( numbuff[0] == 'k' || numbuff[0] == 'K' ) {
- /* 旧番号モードトグル */
- if( k_suppress ) {
- k_suppress = 0;
- } else {
- k_suppress = 1;
- }
- break;
-
- } else if( numbuff[0] == 'a' || numbuff[0] == 'A' ) {
- /* 字名モードトグル */
- if( azamei_gentei ) {
- azamei_gentei = 0;
- } else {
- azamei_gentei = 1;
- }
- break;
-
- } else if( numbuff[0] == 'd' || numbuff[0] == 'D' ) {
- /* 区切りモードトグル */
- if( kugiri_mode ) {
- kugiri_mode = 0;
- } else {
- kugiri_mode = 1;
- }
- break;
-
- } else if( numbuff[0] == 'g' || numbuff[0] == 'G' ) {
- /* 厳密モードトグル */
- if( genmitsu_mode ) {
- genmitsu_mode = 0;
- } else {
- genmitsu_mode = 1;
- }
- break;
-
- } else if( numbuff[0] == 'n' || numbuff[0] == 'N' ||
- numbuff[0] == '\0' ) {
- /* 次のページへ */
- if( gen_page != zen_page ) {
- gen_page++;
- break;
- }
- } else if( numbuff[0] == 'b' || numbuff[0] == 'B' ) {
- /* 前のページへ */
- if( gen_page != 1 ) {
- gen_page--;
- break;
- }
-
- } else if( numbuff[0] == 'p' || numbuff[0] == 'P' ) {
- /* 次検索へ */
- dokuji_sw = 1;
- return;
- }
-
- /* 漢字かカナが入力された? */
- if( ismbblead( numbuff[0] ) || /* 1文字はダメよ */
- ( ismbbkana( numbuff[0] ) && strlen( numbuff ) >= 2 ) ) {
- dokuji_sw = 1;
- exist_moji = 1;
- strcpy( input_str, numbuff );
- return;
- }
-
- /* 番号が合っているなら終わり */
- s_num = atoi( numbuff );
- if( s_num >= kijun+1 && s_num <= kijun+lpcnt ) {
- mainlp = 0;
- break;
- }
-
- /* 合っていないなら、郵便番号か? */
- if( is_bangou_legal( numbuff ) ) { /* 番号なら */
- dokuji_sw = 1;
- exist_moji = 1;
- strcpy( input_str, numbuff ); /* 番号として検索 */
- return;
- }
-
- } while ( lp );
-
- } while( mainlp );
-
- /* 選択された */
- lpcnt = s_num % 12 - 1; /* ページ中何番が選択されたか? */
- if( lpcnt == -1 ) {
- lpcnt = 11;
- }
- puts("");
-
- s_num--;
-
- if( pnum[lpcnt][0] != '\0' ) { /* 番号が決まっているのなら */
-
- _dos_c_cls_al();
-
- /* 解析結果の表示 */
- printf("\t %s", page_yomi0[lpcnt] ); /* 読みがなの表示 */
- kugiri();
- if( page_yomi1[lpcnt][0] != '\0' ) {
- printf("%s", page_yomi1[lpcnt] );
- kugiri();
- }
- if( page_yomi2[lpcnt][0] != '\0' ) {
- printf("%s", page_yomi2[lpcnt] );
- kugiri();
- }
- printf("\n");
- printf("解析結果 : %s", page_todou[lpcnt] );
- kugiri();
- if( page_kugun[lpcnt][0] != '\0' ) {
- printf("%s", page_kugun[lpcnt] );
- kugiri();
- }
- if( page_tyouson[lpcnt][0] != '\0' ) {
- printf("%s", page_tyouson[lpcnt] );
- kugiri();
- }
- printf("\n\n");
-
- /* 1件しかないね? */
- if( pnum[lpcnt][0] == '*' ) {
- printf("%s%s", page_todou[lpcnt], page_kugun[lpcnt] );
- if( page_tyouson[lpcnt][0] != '\0' ) {
- moji_pr( page_tyouson[lpcnt], input_str );
- }
- printf("内の郵便番号はすべて %s ", &pnum[lpcnt][1] );
- if( !k_suppress ) {
- k_num_disp( pknum[lpcnt] );
- }
- printf(" です。\n");
-
- } else {
-
- if( !k_suppress ) {
- k_num_disp( pknum[lpcnt] );
- }
- printf("%s", &pnum[lpcnt][1] ); /* 頭は表示しない */
- printf(": ");
- moji_pr( page_azamei[lpcnt], input_str );
- printf("(%s)\n", page_yomi3[lpcnt] );
- }
- dokuji_sw = 1;
-
- } else { /* 番号が決まっていない */
-
- printf("警告 502 : この候補は、まだ検索できません。\n");
- dokuji_sw = 0;
-
- // if( joukyou[ s_num ] == ' ' ) { /* 都道府県 */
- //
- // ofs = point[ s_num ];
- // todou_kensaku( page_todou[lpcnt], ofs );
- // }
- }
-
- }
-
- return;
- }